#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author : gao
# Time : 2020/7/3 21:09

import numpy as np


'''
    k近邻初步
    自定义数据
'''

def createDataSet():
    # 六组二维特征
    group = np.array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])
    # 六组特征的标签
    labels = ['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片']
    return group, labels


"""
Parameters:
    inX - 用于分类的数据(测试集)
    dataSet - 用于训练的数据(训练集)
    labes - 分类标签
    k - kNN算法参数,选择距离最小的k个点
Returns:
    sortedClassCount[0][0] - 分类结果
"""


# 函数说明:kNN算法,分类器
def classify0(inX, dataSet, labels, k):
    # 把inx复制为与dataSet同维数
    inX = np.tile(inX, (dataSet.shape[0], 1))
    # 做平方差
    diffMat = (inX - dataSet) ** 2
    # 将第一维度相加，（维度从0开始）
    lossMat = np.sum(diffMat, axis=1)
    # 排序
    sortedTags = np.argsort(lossMat)
    # 定义一个字典，保存每个的类别的数量
    dictTags = {}
    for i in range(k):
        # 获取第i小的 的标签
        tmpTag = labels[sortedTags[i]]
        # 把标签放进字典
        dictTags[tmpTag] = dictTags.get(tmpTag, 0) + 1  # 相当于java的map的getOrDefault()
    # 找最大的标签
    minTimes = -1  # 擂台法
    closest = 0  # 记录标签
    for key in dictTags.keys():
        if dictTags[key] > minTimes:
            minTimes = dictTags[key]
            closest = key
    return closest


if __name__ == '__main__':
    data, labels = createDataSet()
    inX = np.array([3,105])
    print(classify0(inX, data, labels, 2))
